#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e6 + 5;
int a[maxn];
int b[505], c[505];
int n, m, k;
int dp[10005]; // 不表示提升 i 需要的最小的精力, 而是, 提升 i 以上, 最小需要的精力 

bool check(int v){
	int tot = 0; // 总精力
	for (int i=1;i<=n;i++) {
		if (a[i] >= v) {
			continue;
		}
		tot += dp[v-a[i]];
	}
	return tot <= k;
}


void solve(){
	int mn=1e18; // 记录最小力量
	cin >> n >> m >> k;
	for (int i=1;i<=n;i++) {
		cin >> a[i];
		mn = min(mn, a[i]);
	}
	
	for (int i=1;i<=m;i++) {
		cin >> b[i];
	}
	
	for (int i=1;i<=m;i++) {
		cin >> c[i];
	}
	
	for (int i=1;i<10005;i++) {
		dp[i] = 1e18;
	}
	
	for (int i=1;i<=m;i++) {
		for (int j=0;j<15;j++) {
			// 根据题意
			// dp[j] 表示提升 j 以上最少需要的精力, 而不是准确提升 j 最少需要的精力
			dp[j] = min(dp[j], dp[max((int)0, j-b[i])]+c[i]); // 所以当 b[i] > j  时, 说明提升了 更多, 也是满足情况的  
//			cout << j << ' ' << dp[j] << '\n';
		}
	}
	
	// 然后进行二分, 遍历最小值
	int l = 1, r = 1e4 + 105;
	
	while(l<r-1){
		//TODO
		int md = ((r-l)>>1) + l;
		if (check(md)) {
			l = md;
		} else {
			r=md;
		}
	}
	
	cout << l << '\n';
	
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
